package modelo.hibernate.dao;

import java.util.ArrayList;
import java.util.List;

import modelo.entidad.Estado;


import modelo.entidad.Municipio;


import modelo.entidad.Sugerencia;
import modelo.entidad.Usuario;
import modelo.entidad.Zona;
import modelo.hibernate.config.Sesion;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

public class DaoUbicacion {
	
	private Sesion sesionPostgres;
	private List<Zona> zonas;
	
	public void agregaraZona(Zona zona) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.save(zona);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	public void eliminarZona(Zona zona) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.delete(zona);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	public void eliminarMunicipio(Municipio muni) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.delete(muni);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	public void agregarMunicipio(Municipio muni) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.save(muni);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	
	public void modificarEstado(Estado estado) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.update(estado);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
	public void agregarEstado(Estado dato) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.save(dato);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}

	public List<Municipio> BuscarMunicipios(Estado dato) throws Exception {            
	      
		List<Municipio> datos = new ArrayList<Municipio>();  
	  Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Municipio>) em.createCriteria(Municipio.class).add(Restrictions.eq("estado",dato)).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}	
	
	public List<Zona> BuscarZonas(Municipio dato) throws Exception{		 
	    @SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
            List<Zona> datos = null;        
            try{
            	 datos =  (List<Zona>) em.createCriteria(Zona.class).add(Restrictions.eq("municipio",dato)).list();    
            } catch (Exception e) {  
            e.printStackTrace();
           
            throw new Exception(e.getMessage(),e.getCause());
            }  finally {  
                em.close();  
            }  
           
	    return datos;
}
	public Estado BuscarEstado(String nombre) throws Exception{		 
	    @SuppressWarnings("static-access")
		Session sesion = sesionPostgres.openSession();  
            Estado dato = null;        
            try{
                dato = (Estado) sesion.get(Estado.class,  nombre);
            } catch (Exception e) {  
            e.printStackTrace();
           
            throw new Exception(e.getMessage(),e.getCause());
            }  finally {  
                sesion.close();  
            }  
           
	    return dato;
}
	
	
	public List<Municipio> obtenerTodosMunicipios() throws Exception {            
	      
		List<Municipio> datos = new ArrayList<Municipio>();  
		Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Municipio>) em.createCriteria(Municipio.class).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}
	
	public List<Estado> obtenerTodosEstados() throws Exception {            
	      
		List<Estado> datos = new ArrayList<Estado>();  
		Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Estado>) em.createCriteria(Estado.class).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}
	
	public List<Zona> obtenerTodasZonas() throws Exception {            
	      
		List<Zona> datos = new ArrayList<Zona>();  
		Session em = sesionPostgres.openSession();  	
        try {  	
	    datos =  (List<Zona>) em.createCriteria(Zona.class).list();             
        } catch (Exception e) {             
       
         throw new Exception(e.getMessage(),e.getCause());
        } finally {  
          em.close();  
        } 
       
        return datos; 
	}

	
	public void actualizarZona(Zona dato) throws Exception{
		@SuppressWarnings("static-access")
		Session em = sesionPostgres.openSession();  
         Transaction tx = null;  
         try {    
        	 tx = em.beginTransaction();
              em.update(dato);   
              tx.commit();  
         } catch (Exception e) {  
             tx.rollback();            
             e.printStackTrace();
             throw e;
         } finally {  
             em.close();  
         } 
	}
}
